package jp.co.toshiba.ffsa.service.csas;

import java.sql.Timestamp;
import java.util.Calendar;

import jp.co.toshiba.ffsa.entity.User;
import jp.co.toshiba.ffsa.mail.SendMaiMail;
import jp.co.toshiba.ffsa.service.common.CommonService;
import jp.co.toshiba.ffsa.service.common.ConstantValue;

import org.seasar.extension.jdbc.JdbcManager;
import org.seasar.framework.container.SingletonS2Container;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;
import org.seasar.mai.mail.MailAddress;
import org.seasar.struts.util.MessageResourcesUtil;

import com.ozacc.mail.MailSendException;

/**
 * 正式登録完了
 * @author npc
 */
public class Csas105Service {
    private String reg = "";

    /** ユーザID */
    private String userID = null;

    /**
     * URL引数と一致するデータが存在するかチェック
     * @return
     * @throws Exception
     */
    public String urlCheck( ) throws Exception {
        // S2Container初期化
        SingletonS2ContainerFactory.init();
        // S2ContainerからJdbcManagerを取得
        JdbcManager jdbcManager = SingletonS2Container.getComponent(JdbcManager.class);
        try{
            // URL引数と一致するデータを取得
            User user= jdbcManager.selectBySql( User.class
                    , "select * from user where ? = sha(concat(user_id,DATE_FORMAT(password_updated_at,'%Y%m%d%H%i%s'))) and delete_flag = '0'"
                    , this.reg)
                    .getSingleResult()
                    ;
            // データが存在する場合
            if(user != null){
                // 正式登録済みの場合
                if(user.userIDFlag.equals("1")){
                    return "1";
                }else if(user.userIDFlag.equals("0")){
                    // 仮登録の有効期限(24時間)をチェックする
                    boolean isInExpirationDate = checkTimeLimit(user);
                    if(!isInExpirationDate) {
                        return "4";
                    }
                    // 仮登録の場合,データを更新;メールを送信する
                    updateRegInfo(user.userID,user.createdAt);
                    // 顧客向けメールを送信する
                    this.sendMailCustomer(user.mailAddress);
                    // 管理者向けメールを送信する
                    this.sendMailAdministrator(user.mailAddress, user.region);

                    this.userID = user.userID;

                    return "2";
                }
            }else{
                // データが存在しない場合
                return "3";
            }
        }catch(Exception e){
            throw e;
        }
        return "0";
    }

    private boolean checkTimeLimit(User user) {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.HOUR, -24);
        if (user.passwordUpdateAt.before(cal.getTime())) {
            return false;
        }
        return true;
    }

    /**
     * ユーザー情報更新を行う
     * @throws Exception
     */
    public void updateRegInfo(String userID,Timestamp createdAt) throws Exception{
        // S2Container初期化
        SingletonS2ContainerFactory.init();
        // S2ContainerからJdbcManagerを取得
        JdbcManager jdbcManager = SingletonS2Container.getComponent(JdbcManager.class);
        try{
            // 当日取得
            Calendar cal = Calendar.getInstance();
            Timestamp updatedAt = new Timestamp(cal.getTime().getTime());

            // 更新
            jdbcManager.updateBySql("update user set user_id_flag = '1',updated_at= ?,updated_by= ?  where user_id= ?  and delete_flag = '0' ",
                    Timestamp.class,
                    String.class,
                    String.class)
                    .params(updatedAt, userID,userID)
                    .execute();

        }catch(Exception e){
            throw e;
        }
    }

    /**
     * 顧客向け メール送信
     * @throws Exception エラー
     */
    public void  sendMailCustomer(String mailAddress) throws Exception {
        try {
            // アプリケーションのルートURLを取得
            String rootUrl = MessageResourcesUtil.getMessage("root_url");
            String registerUrl = rootUrl + "cstp/cstp101/";

            // メール情報をセット
            SendMaiMail sendMaiMail = new SendMaiMail();

            // 送信元メールアドレス(From)
            String mailAddressFrom = MessageResourcesUtil.getMessage("mail_address_from");
            sendMaiMail.setMailAddressFrom(mailAddressFrom);

            // 送信先メールアドレス(To)
            MailAddress[] sendMailAddressTo = new MailAddress[1];
            sendMailAddressTo[0] = new MailAddress(mailAddress,"");

            sendMaiMail.setMailAddressTo(sendMailAddressTo);

            sendMaiMail.setReplacementItem1(registerUrl);

            sendMaiMail.setReplacementSubject("");
            // 送信
            sendMaiMail.sendMail(ConstantValue.completedMailCustomer);

        }catch(MailSendException m){
        }catch(Exception e){
            e.printStackTrace();
            throw e;
        }
        // return true;
    }

    /**
     * 管理者向けメール送信
     * @throws Exception エラー
     */
    public void sendMailAdministrator(String userMailAddress, String region) throws Exception {
        try {
            // アプリケーションのルートURLを取得
            // メール情報をセット
            SendMaiMail sendMaiMail = new SendMaiMail();

            // 送信元メールアドレス(From)
            String mailAddressFrom = MessageResourcesUtil.getMessage("mail_address_from");
            sendMaiMail.setMailAddressFrom(mailAddressFrom);

            // 送信先メールアドレス(To)
            CommonService commonService = new CommonService();
            MailAddress[] sendMailAddressTo = commonService.getRegionAdministrator(region);

            if(sendMailAddressTo != null && sendMailAddressTo.length > 0){
                // 送信先メールアドレス
                sendMaiMail.setMailAddressTo(sendMailAddressTo);
                // 置き換え文字列
                sendMaiMail.setReplacementItem1(userMailAddress);
                sendMaiMail.setReplacementSubject("");
                // 送信
                sendMaiMail.sendMail(ConstantValue.completedMailAdministrator);
            }else{
                return;
            }
        }catch(MailSendException m){
        }catch(Exception e){
            e.printStackTrace();
            throw e;
        }
    }

    /**
     * ユーザIDをセットする
     * @param emailAddress
     */
    public void setUserID(String userID){this.userID = userID;}

    /**
     * ユーザーIDを取得する
     * @return userID
     */
    public String getUserID(){return this.userID;}

    /**
     * regをセットする
     * @param reg
     */
    public void setReg(String reg){this.reg = reg;}

    /**
     * regを取得する
     * @return reg
     */
    public String getReg(){return this.reg;}

}